/**
 * 
 */
package com.xpec.c4.codec.manual;

import java.io.UnsupportedEncodingException;
import java.nio.ByteBuffer;
import java.util.Collection;

import com.xpec.c4.game.utility.GUID;

/**
 * 字节流手动编码
 * 
 * @author lipeilin
 * @2011-10-22 下午03:08:31
 * 
 */
public class BytesManualEncode {

	private ByteBuffer bb;

	/**
	 * 
	 */
	public BytesManualEncode(int length) {
		bb = ByteBuffer.allocate(length);
	}

	public void putFloat(float value) {
		bb.putFloat(value);
	}

	public void putInt(int value) {
		bb.putInt(value);
	}

	public void putShort(short value) {
		bb.putShort(value);
	}

	public void putByte(byte value) {
		bb.put(value);
	}

	/**
	 * 放置Boolean<br>
	 * 占用一个byte，true为1，false为0
	 * 
	 * @param value
	 *
	 * @2011-10-24 下午03:49:37
	 */
	public void putBoolean(boolean value) {
		if (value) {
			bb.put((byte) 1);
		} else {
			bb.put((byte) 0);
		}
	}

	/**
	 * 放置String<br>
	 * 第一个short表示string长度，当string为null时，长度=-1<br>
	 * 后面为string的byte数据（utf8格式）
	 * 
	 * @param value
	 *
	 * @2011-10-24 下午03:37:17
	 */
	public void putString(String value) {
		if(value==null){
			bb.putShort((short)-1);
			return;
		}
		bb.putShort((short) value.length());
		try {
			bb.put(value.getBytes("UTF-8"));
		} catch (UnsupportedEncodingException e) {
			throw new RuntimeException(e);
		}
	}
	public void putUUID(GUID guid){
		if(guid == null)
			putBoolean(false);
		else{
			putBoolean(true);
			bb.putInt(guid.firstId);
			bb.putInt(guid.secId);
			bb.putInt(guid.lastId);
		}
	}
	/**
	 * 放置Collection<String><br>
	 * 第一个short表示Collection长度，当Collection为null时，长度=-1<br>
	 * 后面为string的byte数据（utf8格式）
	 * 
	 * @param value
	 *
	 * @2011-10-24 下午03:37:17
	 */
	public void putCollectionString(Collection<String> value) {
		if(value==null){
			bb.putShort((short)-1);
			return;
		}
		bb.putShort((short) value.size());
		
		for (String string : value) {
			putString(string);
		}
	}
	
	/**
	 * 放置Collection<UUID><br>
	 * 第一个short表示Collection长度，当Collection为null时，长度=-1<br>
	 * 后面为UUID的byte数据
	 */
	public void putCollectionUUID(Collection<GUID> value) {
		if(value==null){
			bb.putShort((short)-1);
			return;
		}
		bb.putShort((short) value.size());
		
		for (GUID id : value) {
			putUUID(id);
		}
	}
	
	/**
	 * 放置byte[]<br>
	 * 第一个short表示数组长度，当数组为null时，长度=-1<br>
	 * 后面为byte[]数据
	 * 
	 * @param value
	 *
	 * @2011-12-1 下午04:33:40
	 */
	public void putArrayByte(byte[] value) {
		if(value==null){
			bb.putInt(-1);
			return;
		}
		bb.putInt(value.length);
		bb.put(value);
	}

	/**
	 * 获得byte[]
	 * 
	 * @return
	 * 
	 * @2011-10-22 下午03:20:52
	 */
	public byte[] asBytes() {
		int length = bb.position();
		byte[] bytes = new byte[length];
		bb.flip();
		bb.get(bytes, 0, length);
		return bytes;
	}

}
